package edu.ec.tesis.prototiporecomendador.ngc.IMDBQuery;
import java.util.LinkedList;

/**Clase que representa la instancia principal de una pelicula, que contendra
 * toda la informacion obtenida de la base de datos de IMDB.
 * 
 * @author Claudio Valverde
 */

public class MovieIMDB {
  
	/**
	 * Titulo univoco en la base de datos de IMDB, con el anio incluido 
	 * (por ejemplo: Toy Story (1995)).
	 */
  private String titleIMDB;
	
	/**
	 * Titulo con el que se busca la pelicula desde el fichero origen o por el usuario,
	 * y que luego fue contrastado con el fichero aka-titles.list de IMDB generando
	 * asi el titulo univoco <code>titleIMDB</code> .
	 */
	private String title;
	
	/**
	 * Anio de estreno de la pelicula.
	 */
        
        
  private String year;
	
	/**
	 * Identificador univoco en la base de datos IMDB.
	 */
  private String id;
	
	/**
	 * En caso de haber cargado la pelicula a partir de un fichero, este atributo
	 * indica la linea correspondiente, sera el mismo atributo <code>lineFile</code>
	 * de la <code>Movie</code> inicial.
	 * 
	 * @see Movie
	 * @see LectorDatos
	 */
  private String lineInDAT;
	
  /**
	 * Instancia <code>Cast</code> que contiene los actores y actrices de la pelicula.
	 * 
	 * @see Cast
	 */
  private Cast cast;
	
	  /**
	 * Instancia <code>Crew</code> que contiene todo el personal de la pelicula:
	 * <ul>
	 * <li> Directores
	 * <li> Escritores
	 * </ul>
	 * 
	 * @see Crew
	 */
  private Crew crew;
  
  
	/**
	 * Generos definidos por IMDB en los que la pelicula se encuentra clasificada.
	 */
	private LinkedList<String> genres;
	
  
	/**
	 * Instancia <code>Rating</code> de la pelicula.
	 * 
	 * @see Rating
	 */
  private Rating rating;
  
	
	/**
	 * Constructor que inicializa todos las instancias y LinkedList de una 
	 * <code>Movie</code>. para evitar NullPointerException en agregaciones posteriores,
	 * tambien establece el <code>titleIMDB</code> a partir del parametro <code>titulo</code>.
	 * 
	 * @param titulo Titulo y anio definitivo de la pelicula (univoco), obtenido a 
	 * partir de la busqueda de los ficheros movies.list y aka-titles.list de IMDB.
	 * 
	 * @see IMDBReader
	 */
	
  public MovieIMDB(String titulo) {
    titleIMDB = titulo;
    setTitleAndYear(titulo);
    cast =  new Cast();
    crew = new Crew();
    genres = new LinkedList();
    rating = new Rating();
  }
  
	/**	Establece los atributos <code>title</code> y <code>year</code> de la pelicula
	 * a partir del string <code>titulo</code>.
	 * 
	 * @param titulo titulo con formato Nombre (anio de estreno), por ejemplo, 
	 * Toy Story (1995).
	 * 
	 */
  private void setTitleAndYear(String titulo) {
    int length;
    
    length = titulo.length();
    this.year = titulo.substring(length-5, length-1);
    this.title = titulo.substring(0, length-7);
  }
  
  public void setID(String i) {
    id = i;
  }
  
  public String getID() {
    return id;
  }
  
  public void setYear(String y) {
    year = y;
  }
  
  public String getYear() {
    return year;
  }
  
  public void setTitle(String t) {
    title = t;
  }
  
  public String getTitle() {
    return title;
  }
  
  public void setLineInDAT(String l) {
    lineInDAT = l;
  }
  
  public String getLineInDAT() {
    return lineInDAT;
  }
  
  public void setTitleIMDB(String t) {
    titleIMDB = t;
  }
  
  public String getTitleIMDB() {
    return titleIMDB;
  }
  
  public Cast getCast(){
    return cast;
  }
  
  public void addCast(String g) {
	    cast.addActor(g);
	  }
  
  public Crew getCrew() {
    return crew;
  }
  
  public void addDirector(String d){
	  crew.addDirector(d);
  }
  
  public void addWriter(String w){
	  crew.addWriter(w);
  }
  
  public int getNumGenres() {
    return genres.size();
  }
  
  public LinkedList<String> getGenres() {
    return genres;
  }
  
  public void addGenre(String g) {
    genres.add(g);
  }
  
  public String getGenre(int index) {
    return genres.get(index);
  }
  
  public void setRating(String v, String r) {
    rating.setVotes(v);
    rating.setRank(r);
  }
  
  public Rating getRating(){
    return rating;
  }	
}